package com.example.userlogindemo.controller;

import com.example.userlogindemo.assist.LoginForm;
import com.example.userlogindemo.assist.ChangeInfo;
import com.example.userlogindemo.assist.RegisterFrom;
import com.example.userlogindemo.entity.Userdata;
import com.example.userlogindemo.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Optional;
import java.util.Random;

@RestController
@RequestMapping("/")
public class UserController {
    /*
     * 注入对象
     * */
    @Autowired
    private UserRepository userRepository;

    /*
     * 登录
     * */
    @PostMapping("/login")
    public Integer userLogin(@RequestBody LoginForm loginForm) {
        // 根据username查找用户
        Optional<Userdata> userLogin = userRepository.findById(loginForm.getUsername());
        // 用户未找到
        if (userLogin.isEmpty()) {
            return -1;
        }
        // 检查password
        if (userLogin.get().getPassword().equals(loginForm.getPassword())) {
            // 更新登录状态
            userLogin.get().setLoginState(1);
            userRepository.save(userLogin.get());
            // 返回随机token
            Random random = new Random();
            // TODO: 保存这个token到数据库，以便多设备登录
            return random.nextInt(1000);
        }
        return -1;
    }

    /*
     * 注册
     * 自动生成一个时间戳并将用户数据自动添加到数据库中
     * */
    @PutMapping("/register")
    public Integer userRegister(@RequestBody RegisterFrom registerFrom) {
        // 转换为userdata
        Userdata userdata = new Userdata(registerFrom);
        // 用户已存在
        Optional<Userdata> userRegister = userRepository.findById(userdata.getUsername());
        if (userRegister.isPresent()) {
            return -1;
        }
        // 用户注册时自动生成一个时间戳
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date = new Date();
        String timeString = sdf.format(date);
        userdata.setRegisterTime(timeString);
        // 将前端提供的userdata存储到数据库中并刷新
        userRepository.saveAndFlush(userdata);
        // 返回token
        Random random = new Random();
        // TODO: 保存这个token到数据库，以便多设备登录
        return random.nextInt(1000);
    }

    /*
     * 注销
     * */
    @PostMapping("/logout")
    public Integer userLogout(@RequestBody LoginForm loginForm) {
        // 用户不存在
        Optional<Userdata> userRegister = userRepository.findById(loginForm.getUsername());
        if (userRegister.isEmpty()) {
            return -1;
        }
        // 更新数据库中用户登录状态
        userRegister.get().setLoginState(0);
        userRepository.save(userRegister.get());
        return 1;
    }

    /**
     * 修改个人信息
     * 当且仅当用户名存在, 并且登录状态loginState = 1才允许修改
     * 否则返回404
     * */
    @PutMapping("/modify")
    public ResponseEntity<Void> userModify(@RequestBody ChangeInfo changeInfo) {
        // 用户不存在
        Optional<Userdata> userRegisterOptional = userRepository.findById(changeInfo.getUsername());
        if (userRegisterOptional.isEmpty()) {
            return ResponseEntity.status(HttpStatus.NOT_FOUND).build();
        }
        Userdata userRegister = userRegisterOptional.get();
        // 用户非登录状态
        if(userRegister.getLoginState() != 1){
            return ResponseEntity.status(HttpStatus.NOT_FOUND).build();
        }
        // 将changeInfo中所有的字段保存
        userRegister.ModifyByChangeInfo(changeInfo);
        // 更新数据库中的用户数据
        userRepository.save(userRegister);
        return ResponseEntity.status(HttpStatus.ACCEPTED).build();
    }

    /*
     * 查询
     * 返回数据库中的数据
     * */
    @GetMapping("/debugData/{numbers}")
    public Page<Userdata> userData(@PathVariable("numbers") Integer numbers) {
        // 检查numbers是否合法, 从0开始
        if (numbers < 0) {
            return null;
        }
        // 返回数据库第0页, 该页上有numbers条数据
        Pageable pageable = PageRequest.of(0, numbers);
        return userRepository.findAll(pageable);
    }

    @GetMapping("/debug")
    public String testFunc(){
        return "Hello World";
    }


    /*
    * 查询账号信息
    * */
    @PostMapping("/info")
    public ResponseEntity<Userdata> userInfo(@RequestBody LoginForm loginForm){
        // 用户不存在
        Optional<Userdata> userRegister = userRepository.findById(loginForm.getUsername());
        if (userRegister.isEmpty()) {
            return ResponseEntity.status(HttpStatus.NOT_FOUND).build();
        }
        // 返回账号信息
        return ResponseEntity.status(HttpStatus.OK).body(userRegister.get());
        /*
        * 非链式编程可能写为
        *   return new ResponseEntity<>(userdata, HttpStatus.OK);
        * */
    }

    /*
     * 删除
     * */
    @DeleteMapping("/delete")
    public ResponseEntity<Void> userDelete(@RequestBody Userdata userdata) {
        // 查询数据库中是否有该用户
        Optional<Userdata> userModify = userRepository.findById(userdata.getUsername());
        // 用户不存在
        if (userModify.isEmpty()) {
            return ResponseEntity.status(HttpStatus.FORBIDDEN).build();
        }
        // 删除该用户的数据
        userRepository.delete(userdata);
        return ResponseEntity.status(HttpStatus.ACCEPTED).build();
    }
}
